package pres.liko.iot.user.service.impl;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
import org.springframework.data.relational.core.query.Criteria;
import org.springframework.data.relational.core.query.Query;
import org.springframework.stereotype.Service;
import pres.liko.iot.bean.R;
import pres.liko.iot.user.pojo.Dc3User;
import pres.liko.iot.user.pojo.UserToken;
import pres.liko.iot.user.service.UserService;
import pres.liko.iot.utils.SnowFlakeUtil;
import reactor.core.publisher.Mono;

import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;

/**
 * @ClassName: UserServiceImpl
 * @Auther: liko
 * @Description:
 * @Date: 2022/11/3 20:12
 */
@Service
public class UserServiceImpl implements UserService {

    private R2dbcEntityTemplate r2dbcEntityTemplate;

    @Autowired
    public UserServiceImpl(R2dbcEntityTemplate r2dbcEntityTemplate) {
        this.r2dbcEntityTemplate = r2dbcEntityTemplate;
    }

    @Override
    public Mono<R<Object>> addUser(Mono<Dc3User> dc3UserMono) {
        return dc3UserMono.flatMap(dc3User -> {
            dc3User.setId(SnowFlakeUtil.getSnowFlakeId().toString());
            dc3User.setCreateTime(LocalDateTime.now());
            dc3User.setUpdateTime(LocalDateTime.now());
            return r2dbcEntityTemplate.insert(dc3User)
                    .map(dc3User1 -> R.ok())
                    .defaultIfEmpty(R.fail("添加失败"));
        });
    }

    @Override
    public Mono<R<UserToken>> selByName(String name, String password) {

        return r2dbcEntityTemplate.select(Dc3User.class)
                .from("dc3_user")
                .matching(Query.query(Criteria.where("name").is(name)
                        .and("password").is(password)))
                .first()
                .map(dc3User -> {
                    String token = Jwts.builder()
                            .setSubject("user")
                            .claim("nameOrPhoneOrEmail", name)
                            .signWith(SignatureAlgorithm.HS256, "madedaodifanhuisha".getBytes(StandardCharsets.UTF_8))
                            .compact();
                    UserToken userToken = new UserToken(dc3User.getId(), name, token);
                    return R.ok(userToken);
                })
                .defaultIfEmpty(R.fail("d"));
        // return r2dbcEntityTemplate.select(Dc3User.class)
        //         .from("dc3_user")
        //         .matching(Query.query(Criteria.where("name").is(nameOrPhoneOrEmail)
        //                 .and("enable").is(1)
        //                 .and("deleted").is(0)
        //                 .and("password").is(password)))
        //         .first()
        //         .map(dc3User -> {
        //             String token = KeyUtil.generateToken(nameOrPhoneOrEmail, "madedaodifanhuisha", dc3User.getId());
        //             UserToken userToken = new UserToken(dc3User.getId(), nameOrPhoneOrEmail, token);
        //             return R.ok(userToken);
        //         })
        //         .defaultIfEmpty(r2dbcEntityTemplate.select(Dc3User.class)
        //                 .from("dc3_user")
        //                 .matching(Query.query(Criteria.where("phone").is(nameOrPhoneOrEmail)
        //                         .and("enable").is(1)
        //                         .and("deleted").is(0)
        //                         .and("password").is(password)))
        //                 .first()
        //                 .map(dc3User -> {
        //                     String token = KeyUtil.generateToken(nameOrPhoneOrEmail, "madedaodifanhuisha", dc3User.getId());
        //                     UserToken userToken = new UserToken(dc3User.getId(), nameOrPhoneOrEmail, token);
        //                     return R.ok(userToken);
        //                 })
        //                 .defaultIfEmpty(r2dbcEntityTemplate.select(Dc3User.class)
        //                         .from("dc3_user")
        //                         .matching(Query.query(Criteria.where("email").is(nameOrPhoneOrEmail)
        //                                 .and("enable").is(1)
        //                                 .and("deleted").is(0)
        //                                 .and("password").is(password)))
        //                         .first()
        //                         .map(dc3User -> {
        //                             String token = KeyUtil.generateToken(nameOrPhoneOrEmail, "madedaodifanhuisha", dc3User.getId());
        //                             UserToken userToken = new UserToken(dc3User.getId(), nameOrPhoneOrEmail, token);
        //                             return R.ok(userToken);
        //                         })
        //                         .defaultIfEmpty(R.fail("账号或密码错误"))));
        // return null;
    }

    @Override
    public Mono<R<Object>> Login(String nameOrPhoneOrEmail, String password) {
        // return Mono.just(nameOrPhoneOrEmail)
        //         // 字符串不为空
        //         .filter(s -> StringUtils.isNotBlank(s))
        //         .doOnNext(s -> Mono.just(s)
        //                 .filter(email -> email.matches(Validates.EMAIL_REG.getStr()))
        //                 .doOnNext(email -> r2dbcEntityTemplate.select(Dc3User.class)
        //                         .from("dc3_user")
        //                         .matching(Query.query(Criteria.where("email").is(email)
        //                                 .and("password").is(password)))
        //                         .first()
        //                         .map(dc3User -> {
        //                             String token = KeyUtil.generateToken(nameOrPhoneOrEmail, "madedaodifanhuisha", dc3User.getId());
        //                             UserToken userToken = new UserToken(dc3User.getId(), nameOrPhoneOrEmail, token);
        //                             return R.ok(userToken);
        //                         })
        //                 )
        //                 .filter(phone -> phone.matches(Validates.PHONE_REG.getStr()))
        //                 .doOnNext(phone -> r2dbcEntityTemplate.select(Dc3User.class)
        //                         .from("dc3_user")
        //                         .matching(Query.query(Criteria.where("phone").is(phone)))
        //                         .first()
        //                         .map(dc3User -> {
        //                             String token = KeyUtil.generateToken(nameOrPhoneOrEmail, "madedaodifanhuisha", dc3User.getId());
        //                             UserToken userToken = new UserToken(dc3User.getId(), nameOrPhoneOrEmail, token);
        //                             return R.ok(userToken);
        //                         })
        //                 )
        //                 .map(name -> {
        //                     return r2dbcEntityTemplate.select(Dc3User.class)
        //                             .from("dc3_user")
        //                             .matching(Query.query(Criteria.where("name").is(name)
        //                                     .and("password").is(password)))
        //                             .first()
        //                             .map(dc3User -> {
        //                                 String token = KeyUtil.generateToken(nameOrPhoneOrEmail, "madedaodifanhuisha", dc3User.getId());
        //                                 UserToken userToken = new UserToken(dc3User.getId(), nameOrPhoneOrEmail, token);
        //                                 return R.ok(userToken);
        //                             });
        //                 })
        //                 .defaultIfEmpty(R.fail(""));
        //         )
        //         .defaultIfEmpty(R.fail("查询条件不满足"))
        //         .flatMap(s -> s);
        // );
        return null;
    }

}
